#include"tcpClient.h"
#include"logger.h"
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<string.h>
#include"public.h"
#include"IpAddressPort.h"
#include<iostream>

    TcpClient::TcpClient(const IpAddressPort& ipAddressAndPort)
    {
        m_sfd = socket(AF_INET,SOCK_STREAM,0);
        if(-1==m_sfd)
        {
            LOG_FATAL<<strerror(errno);
        }
        struct sockaddr_in ser;
        ser.sin_family=AF_INET;
        ser.sin_addr.s_addr=inet_addr(ipAddressAndPort.GetIpAddress().c_str());
        ser.sin_port=htons(ipAddressAndPort.GetPort());
        if(-1==connect(m_sfd,(struct sockaddr*)&ser,sizeof(ser)))
        {
            LOG_FATAL<<strerror(errno);
        }
        LOG_INFO<<"连接成功"; 
    }
    TcpClient::~TcpClient()
    {
        if(-1==close(m_sfd))
        {
            LOG_FATAL<<strerror(errno);
        }
    }
    int TcpClient::SendMsg(const std::string &msg)
    {
        int res=send(m_sfd,msg.c_str(),strlen(msg.c_str()),0);
        if(-1==res)
        {
            LOG_ERROR<<strerror(errno);
        }
        return res;
    }
    Msg TcpClient::RecvMsg()
    {
        char buf[MEDIAN_BUF_LEN]={0};
        int res=recv(m_sfd,buf,MEDIAN_BUF_LEN,0);
        if(-1==res)
        {
            LOG_ERROR<<strerror(errno);
        }
        //c11风格
        return Msg{buf,res};

        //c风格
        //return Msg{.m_msg=buf,.m_numberofRecvBytes=res};
    }
    int TcpClient::GetSfd()const
    {
        return m_sfd;
    }

    // int main()
    // {
    //     IpAddressPort ser("127.0.0.1",7000);
    //     TcpClient client(ser);

    //     while(1)
    //     {
    //         char buf[SMALL_BUF_LEN]={0};
    //         std::cout<<"input: "<<std::endl;
    //         fgets(buf,SMALL_BUF_LEN,stdin);
    //         if(strncmp(buf,"end",3)==0)
    //         {
    //             break;
    //         }
    //         client.SendMsg(buf);
    //         memset(buf,0,SMALL_BUF_LEN);
    //         Msg m=client.RecvMsg();
    //         LOG_INFO<<m.ToString();
    //     }
    //     client.~TcpClient();
    //     return 0;
    // }
  